package com.joker.springboottestdemo.job;

import com.joker.demo.core.annotation.JobHandle;
import com.joker.demo.core.domain.dto.JobExecutorParamsDTO;
import com.joker.demo.core.domain.dto.JobExecutorResultDTO;
import com.joker.demo.core.executor.JobExecutorService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

/**
 * 任务类型测试服务
 * <p>
 * 展示两种类型的任务处理器：
 * 1. 方法级别 - 无参数
 * 2. 方法级别 - 有参数（需要实现JobExecutorService接口）
 *
 * @author : feixiang.li
 * @since : 2025-01-27 17:00
 */
@Service
@Slf4j
public class JobTypeTestService implements JobExecutorService {

    /**
     * 第一种类型：方法级别 - 无参数
     * 不支持分片参数
     */
//    @JobHandle("testJobNoParams")
    public void testJobNoParams() throws Exception {
        log.info("执行无参数任务开始");
        
        for (int i = 0; i < 3; i++) {
            log.info("无参数任务执行中：{}", i);
            TimeUnit.SECONDS.sleep(1);
        }
        
        log.info("无参数任务执行完成");
    }

    /**
     * 第二种类型：方法级别 - 有参数
     * 支持分片参数
     * 注意：由于类实现了JobExecutorService接口，这个方法不会被扫描
     * 分片任务应该通过execute方法处理
     */
//    @JobHandle("testJobWithParams")
    public String testJobWithParams(JobExecutorParamsDTO params) throws Exception {
        log.info("执行有参数任务开始，参数: {}", params);
        
        for (int i = 0; i < 3; i++) {
            log.info("有参数任务执行中：{}，分片参数: {}, 分片索引: {}", 
                i, params.getShardingParam(), params.getShardingParamIndex());
            TimeUnit.SECONDS.sleep(1);
        }
        
        String result = "有参数任务执行完成，分片参数: " + params.getShardingParam();
        log.info(result);
        return result;
    }

    /**
     * 实现JobExecutorService接口的execute方法
     * 用于处理支持分片的任务
     */
    @Override
    public JobExecutorResultDTO execute(JobExecutorParamsDTO jobExecutorParamsDTO) {
        log.info("执行JobExecutorService任务开始，参数: {}", jobExecutorParamsDTO);
        
        try {
            for (int i = 0; i < 3; i++) {
                log.info("JobExecutorService任务执行中：{}，分片参数: {}, 分片索引: {}", 
                    i, jobExecutorParamsDTO.getShardingParam(), jobExecutorParamsDTO.getShardingParamIndex());
                TimeUnit.SECONDS.sleep(1);
            }
            
            String result = "JobExecutorService任务执行完成，分片参数: " + jobExecutorParamsDTO.getShardingParam();
            log.info(result);
            return new JobExecutorResultDTO(result);
            
        } catch (Exception e) {
            log.error("JobExecutorService任务执行异常", e);
            return new JobExecutorResultDTO("执行失败: " + e.getMessage());
        }
    }
} 